// 函数类型
// age 入参为number类型  name 入参为string  反参是string 字符串类型
function add(age:number,name:string):string{
    return `我叫${name},今年${age}岁`
}
// console.log(add(12,'ljl'))
// let myadd:(sadsad:number,sddsa:string)=>string
// 函数类型包含两部分：参数类型和返回值类型
let myadd:(sadsad:number,sddsa:string)=>string= (age:number,name:string):string=>{
    return `我叫${name},今年${age}岁`
}
console.log(myadd(13,'ljl'))
// 推断类型 参数类型限制了类型  就算函数体不限制也会走参数类型限制
let add2: (baseValue: number, increment: number) => 
        number = function(x, y) { 
            return x + y
     }
// console.log(add2(123,'2312')) // 报错因为限制了第二个参数为number类型
// 也可以这样写
let add3 = (x:number,y:number):any=>{
     return x + y 
    }
// console.log(add3(1,1))
// 参数传值  需要和定义的入参个数一致
function isName(firstName:string,lastName:string):string{
    return firstName+','+lastName
}
//let isName1 = isName('ljl') //少传一个值
let isName2 = isName('ljl','2wewe') // 正确传值
//let isName3 = isName('ljl','2wewe','213')// 多传一个

// 函数可选参数 可选参数必须在必选参数后面  切 传值不能多于入参值
// lastName='ljl' 默认参数 默认参数不需要放在必须参数的后面 但是传值的时候要用undefined占位置
function isNeedName(firstName:string,lastName?:string):string{
    return firstName+','+lastName
}
let isNeedName1 = isNeedName('ljl') //因为第二值是可选的  所以可传可不传
let isNeedName2 = isNeedName('ljl','2wewe') // 正确传值
//let isNeedName3 = isNeedName('ljl','2wewe','213')//不能多传l

// 剩余参数 可以用变量来接
// 剩余参数会被当做个数不限的可选参数。 可以一个都没有，同样也可以有任意个
function isOtherName(firstName:string,...other:string[]):string{
    return firstName+','+other.join(',')
}
let isOtherName1 = isOtherName('我是第一个','我是剩余参数第一个','我是剩余参数第二个','我是剩余参数第三个')
console.log(isOtherName1)
// 函数类型定义
let buildNameFun: (fname: string, ...rest: string[]) => string = isOtherName;
console.log(buildNameFun('2','3','4','5'))
let nameFn:(...other:any[])=> any = (...other:any[]):any=> {return other }
let name1 = nameFn('2',2,'3',2,34,5,53,535,35)
console.log(name1)